package com.hp.ongoing.service;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import com.hp.ongoing.app.view.exception.ViewException;
import com.hp.ongoing.entity.QuantidadePeriodo;
import com.hp.ongoing.entity.QuantidadesPeriodos;
import com.hp.ongoing.entity.SearchParameter;
import com.hp.ongoing.entity.UserCredentialVO;
import com.hp.ongoing.persistence.constants.QueryConstants;
import com.hp.ongoing.persistence.exception.DataBaseAcessException;
import com.hp.ongoing.persistence.repository.JdbcRepository;
import com.hp.ongoing.util.Constantes;

public class ServiceReport {

	private static final ServiceReport instance = new ServiceReport();

	// private SearchParameter

	private static UserCredentialVO user;

	public static ServiceReport getInstance(UserCredentialVO userCred) {
		user = userCred;
		return instance;
	}
	


	@SuppressWarnings("unchecked")
	public List getAll(SearchParameter search) throws DataBaseAcessException, ViewException {
		
		boolean isValid = validateSearchParams(search);
		
		if (!isValid)
			throw new ViewException(Constantes.REQUIRED_FIELD);
		
		SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy",
				new Locale("pt", "br"));
		 
		 String base[] = { search.getBaseSelecionada() };
		 
		 List <String> basesList  = Arrays.asList(base);
		 List<QuantidadesPeriodos> qtPeriodos = new ArrayList<QuantidadesPeriodos>();
		 List<QuantidadePeriodo> qtdadesISP = new ArrayList<QuantidadePeriodo>();
		 List<QuantidadePeriodo> qtdadesBhz = new ArrayList<QuantidadePeriodo>();
		 List<QuantidadePeriodo> qtdadesABC = new ArrayList<QuantidadePeriodo>();
		 List<QuantidadePeriodo> qtdadesSPO = new ArrayList<QuantidadePeriodo>();
		 List<QuantidadePeriodo> qtdadesBRA = new ArrayList<QuantidadePeriodo>();
		 List<QuantidadePeriodo> qtdadesSUL = new ArrayList<QuantidadePeriodo>();
		 List<QuantidadePeriodo> qtdadesSOC = new ArrayList<QuantidadePeriodo>();
		JdbcRepository repository = null;

		Map<String,String> params = new HashMap<String, String>();		
		params.put(":dtInicio", df.format(search.getDataInicio()));
		params.put(":dtFim", df.format(search.getDataFim()));
		
		if (search.getBaseSelecionada().equals("Todas")){			
			String baseFull[] = { "netabc" ,"netsp", "netbh", "netisp", "netsul","netsorocaba", "netbrasil" };
			basesList = Arrays.asList(baseFull);
		}		
		
		
//		if (basesList.contains("netisp")){
//		user.setAliasBase("netisp");
//		repository = JdbcRepository.getInstance(user);
//		qtdadesISP = repository.findResultsByQuery(
//				QueryConstantsEnum.SELECT_QTD_RECIBOS_ERRO_FILE,
//				QuantidadePeriodo.class, params);
//		} if (basesList.contains("netbh")){		
//		user.setAliasBase("netbh");
//		repository = JdbcRepository.getInstance(user);
//		qtdadesBhz = repository.findResultsByQuery(
//				QueryConstantsEnum.SELECT_QTD_RECIBOS_ERRO_FILE,
//				QuantidadePeriodo.class, params);
//		} if (basesList.contains("netabc")){
//		user.setAliasBase("netabc");
//		repository = JdbcRepository.getInstance(user);		
//		qtdadesABC = repository.findResultsByQuery(
//				QueryConstantsEnum.SELECT_QTD_RECIBOS_ERRO_FILE,
//				QuantidadePeriodo.class, params);
//		} if (basesList.contains("netsul")){
//		user.setAliasBase("netsul");
//		repository = JdbcRepository.getInstance(user);
//		qtdadesSUL = repository.findResultsByQuery(
//				QueryConstantsEnum.SELECT_QTD_RECIBOS_ERRO_FILE,
//				QuantidadePeriodo.class, params);
//		} if (basesList.contains("netsorocaba")){
//		user.setAliasBase("netsorocaba");
//		repository = JdbcRepository.getInstance(user);
//		qtdadesSOC = repository.findResultsByQuery(
//				QueryConstantsEnum.SELECT_QTD_RECIBOS_ERRO_FILE,
//				QuantidadePeriodo.class, params);
//		} if (basesList.contains("netsp")){
//		user.setAliasBase("netsp");
//		repository = JdbcRepository.getInstance(user);
//		qtdadesSPO = repository.findResultsByQuery(
//				QueryConstantsEnum.SELECT_QTD_RECIBOS_ERRO_FILE,
//				QuantidadePeriodo.class, params);
//		} if (basesList.contains("netbrasil")){
//		user.setAliasBase("netbrasil");
//		repository = JdbcRepository.getInstance(user);
//		qtdadesBRA = repository.findResultsByQuery(
//				QueryConstantsEnum.SELECT_QTD_RECIBOS_ERRO_FILE,
//				QuantidadePeriodo.class, params);
//		}
				
			Calendar start = Calendar.getInstance();
			Calendar end = Calendar.getInstance();

			try {
				start.setTime(search.getDataInicio());
				start.set(Calendar.HOUR_OF_DAY, 0);  
				start.set(Calendar.MINUTE, 0);  
				start.set(Calendar.SECOND, 0);  
				start.set(Calendar.MILLISECOND, 0); 
				end.setTime(search.getDataFim());
				end.set(Calendar.HOUR_OF_DAY, 0);  
				end.set(Calendar.MINUTE, 0);  
				end.set(Calendar.SECOND, 0);  
				end.set(Calendar.MILLISECOND, 0);
			} catch (Exception e) {
				e.printStackTrace();
			}
			int cont = 0;

			QuantidadesPeriodos qtperiodo = null;			
			for (; !start.equals(end); start.add(Calendar.DATE, 1)) {
				qtperiodo = new QuantidadesPeriodos();
				Date current = start.getTime();
				qtperiodo.setDataReferencia(current);		
				if (basesList.contains("netbh")){
				qtperiodo.setQtdBaseBHZ(qtdadesBhz.get(cont).getQuantidadeRecibos());
				}  if (basesList.contains("netisp")){
				qtperiodo.setQtdBaseISP(qtdadesISP.get(cont).getQuantidadeRecibos());
				} if (basesList.contains("netsp")){
				qtperiodo.setQtdBaseSPO(qtdadesSPO.get(cont).getQuantidadeRecibos());
				} if (basesList.contains("netbrasil")){
				qtperiodo.setQtdBaseBRA(qtdadesBRA.get(cont).getQuantidadeRecibos());
				} if (basesList.contains("netsul")){
				qtperiodo.setQtdBaseSUL(qtdadesSUL.get(cont).getQuantidadeRecibos());
				} if (basesList.contains("netsorocaba")){
				qtperiodo.setQtdBaseSOC(qtdadesSOC.get(cont).getQuantidadeRecibos());
				} if (basesList.contains("netabc")){
				qtperiodo.setQtdBaseABC(qtdadesABC.get(cont).getQuantidadeRecibos());
				}
				qtPeriodos.add(qtperiodo);
				cont++;							
		}
		return qtPeriodos;

	}



	private boolean validateSearchParams(SearchParameter search) {
		if (search.getBaseSelecionada()==null || search.getPasswordBD().equals("") || search.getUserBD().equals(""))
			return false;
		else
		return true;
	}

}
